package com.github.slowrookie.service;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Persistable;
import org.springframework.data.jpa.domain.Specification;

/**
 * 面向接口编程，规范基本的Crud接口
 * 所有实体类通过接口规范需要实现的接口，每个实体都应至少提供CrudService的相关服务
 * 
 * @author 刘佳兴
 */
public interface DefaultCrudService<T extends Persistable<Long>> {
	
	/**
	 * 持久化方法，包含更新和新增操作
	 * 
	 * @param AuditablePersistable
	 * 		保存信息
	 * @return T
	 * 		返回保存后的用户信息
	 */
	T save(T auditable);
	
	/**
	 * 插入数据
	 * 
	 * @param entities
	 * @return List<T>
	 */
	List<T> save(Iterable<T> entities);
	
	/**
	 * 删除用户数据
	 * 
	 * @param id
	 * 		用户的主键id
	 */
	void delete(Long id);
	
	/**
	 * 删除所有
	 * 
	 * @param entities
	 */
	void detete(Iterable<T> entities);
	
	/**
	 * 批量删除
	 * 
	 * @param entities
	 */
	void deleteInBatch(Iterable<T> entities);
	
	/**
	 * 删除所有
	 * 
	 */
	void deleteAll();
	
	/**
	 * 批量删除所有 
	 */
	void deleteAllInBatch();
	
	/**
	 * 根据id查找
	 * 
	 * @param id
	 * @return T
	 */
	T findOne(Long id);
	
	/**
	 * 是否存在
	 * 
	 * @return
	 */
	boolean exists(Long id);
	
	/**
	 * 数量
	 * 
	 * @return
	 */
	long count();
	
	/**
	 * 按条件查询数量
	 * 
	 * @param queryEntity
	 * @return
	 */
	long count(Specification<T> queryEntity);
	
	/**
	 * 查询所有
	 * 
	 * @return
	 */
	List<T> findAll();
	
	/**
	 * 根据ID查询所有
	 * 
	 * @param ids
	 * 		id list
	 * @return
	 */
	List<T> findAll(Iterable<Long> ids);
	
	/**
	 * 根据查询条件查询所有
	 * 
	 * @param entityQuery
	 * @return
	 */
	List<T> findAll(Specification<T> entityQuery);
	
	/**
	 * 持久类对象的分页查询
	 * 
	 * @param entityQuery
	 * 		实现了 Specification<T> 借口的类
	 * @param pageable
	 * 		分页对象
	 * @return Page<T>
	 */
	Page<T> findAll(Specification<T> entityQuery, Pageable pageable);
	
}
